/**
 * 泛型 -- 宽泛的类型  不等于any  也是有自己的类型 (认真的看下面的例子)
 *  泛型与其他确定类型一样 只不过这个类型是动态的 指定的
 */
{
  function demo(arg) {
    return arg;
  }

  /**
   * demo函数 返回的 a 是一个 any类型 所以我们给 a赋值123 相当于是 any类型赋值 123 不会报错
   *  但是这个其实不是我们想要的 我们想要的是 赋值字符串之后 返回的类型也是字符串
   */
  let a = demo("hello");
  a = 123;

  /**
   * 第二个demo 限制类型  -- 解决了上面的那个问题
   *  但是 只能是传字符串 新的问题又来了 数字呢 布尔值值呢？ 等等等 总不可能一样逻辑的函数因为类型写多个吧~
   *    基于这个场景， TS 的泛型 诞生了
   */
  function demo1(arg: string): string {
    return arg;
  }

  let a1 = demo1("hello world");
  // a1 = 345 报错 不能将字符串a1赋值数字类型

  function demo2<T>(arg: T): T {
    return arg;
  }
  let a2 = demo2("hello world");
  // a2 = 111  报错 因为泛型的存在 这时候a2已经是一个字符串类型 不能再赋值给其他类型

  let a3 = demo2(true);
  // a3 = "test"; 报错 因为泛型的存在，  这时候的a3 已经是一个 布尔类型了

  /**
   * 这就是泛型  会跟你你传入的参数确定类型 并把这个类型作为一个已知的类型进行处理
   */
}
